from mydb.postgre import base

base=base()

base.user='buh'
base.passwd='joczkRX7MkJrPk'
base.host='sa-serv10'
base.port=5432
base.base='ZUP_TEK'

def sums_tables(sums=[], fields=None):
	"This function returns list of table-field pairs from fields list contain all the given sums"
	if fields==None:
		#Выбирается список полей таблиц схемы public
		fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public'")()
	result=[]
	for field in fields:
		#Подготавливается запрос на выборку поля field для записей с соответствующей суммой в поле field
		select=base.conn.prepare("SELECT "+field[1]+" FROM "+field[0]+" WHERE "+field[1]+"=$1")
		#Для каждой суммы в списке сумм:
		flag=True
		for sum in sums:
			#Проверяется:
			try:
				#Возможность выборки данного значения из данного поля данной таблицы
				records=select(sum)
			#Если невозможно (например не соответствует тип данных)
			except:
				#То флаг=False
				flag=False
			#Если возможно
			else:
				#Если результат пустой, то флаг=False:
				if not records:
					flag=False
		#Если все sums есть в этом поле
		if flag=True:
			#К результирующему списку прибавляется список: [таблица, поле]
			result+=[[field[0], field[1], sums]]
			# Для немедленного ознакомления список выводится на экран
			print([field[0], field[1]])
	return result
	
def words_tables(words=[], fields=None):
	"This function returns list of table-idreff pairs from fields list for all the given words"
	if fields==None:
		#Выбирается список полей таблиц схемы public
		fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public'")()
	result=[]
	for field in fields:
		#Подготавливается запрос на выборку поля _idrref для записей с соответствующим словом в поле field
		select=base.conn.prepare("SELECT _idrref FROM "+field[0]+" WHERE "+field[1]+" LIKE '%$1%'")
		#Для каждого слова в списке:
		for word in words:
			#Проверяется:
			try:
				#Возможность выборки данного значения из данного поля данной таблицы
				records=select(word)
			#Если невозможно (например не соответствует тип данных)
			except:
				#То ничего
				pass
			#Если возможно
			else:
				#То для каждой найденной записи:
				for record in records:
					#Если данной записи еще нет в результирующем списке:
					if [field[0], record[0], word] not in result:
						#К результирующему списку прибавляется список: [таблица, idreff]
						result+=[[field[0], record[0], word]]
						# Для немедленного ознакомления список выводится на экран
						print([field[0], record[0], word])
	return result

def tables(words, sums):
	"This function returns list of table-field-corrtable for the given words and sums"
	#beginnig of function suite
	#Создается пустой список результатов
	result={}
	#Выбирается список полей таблиц схемы public
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public'")()
	#Создается список таблиц, содержащих суммы sums
	tables=sums_tables(sums, fields)
	#Создается список таблиц, содержащих суммы words
	idreffs=words_tables(words, fields)
	#Для каждой таблицы в tables:
	for table in tables:
		result[table[0]]=[[table[2],table[1],table[0]]]
		#Создается список полей таблицы
		table_fields=base.conn.prepare("SELECT column_name FROM information_schema.columns WHERE table_schema='public' and table_name=$1")(table[0])
		#Для каждого поля в table_fields:
		for table_field in table_fields:
			#Подготавливается выборка значения из поля:
			select=base.conn.prepare("SELECT "+table_field[0]+" FROM "+table[0]+" WHERE "+table_field[0]+"=$1")
			#Для каждого idreff в idreffs
			for idreff in idreffs:
				#Проверяется:
				try:
					#Возможность выборки данного idreff из данного поля данной таблицы
					records=select(idreff[1])
				#Если невозможно (например не соответствует тип данных)
				except:
					#То ничего
					pass
				#Если возможно
				else:
					#То для каждой найденной записи:
					result[table[0]]+=[[idreff[2], table_field[0], idreff[0]]]
	
	
	
	

def table(words=[], sums=[]):
	"This function returns table name and fields names for the given words and sums"
	#beginnig of function suite
	base.connect()
	#Выбирается список полей таблиц схемы public
	fields=base.conn.prepare("SELECT table_name, column_name FROM information_schema.columns WHERE table_schema='public'")()
	#Создается пустой список полей-таблиц-значений для сумм
	results_sum=[]
	#Создается пустой список полей-таблиц-значений для слов
	results_word=[]
	#Для каждого поля в спике полей таблиц схемы public
	for field in fields:
		#Подготавливается запрос на выборку поля field для записей с соответствующей суммой в поле field
		select_sum=base.conn.prepare("SELECT "+field[1]+" FROM "+field[0]+" WHERE "+field[1]+"=$1")
		#Для каждой суммы в списке сумм:
		for sum in sums:
			#Проверяется:
			try:
				#Возможность выборки данного значения из данного поля данной таблицы
				records=select_sum(sum)
			#Если невозможно (например не соответствует тип данных)
			except:
				#То ничего
				pass
			#Если возможно
			else:
				#То для каждой найденной записи:
				for record in records:
					#Если данной записи еще нет в результирующем списке:
					if [field[0], field[1]] not in results_sum:
						#К результирующему списку прибавляется список: [таблица, поле, значение]
						results_sum+=[[field[0], field[1]]
						# Для немедленного ознакомления список выводится на экран
						print([field[0], field[1])
		#Подготавливается запрос на выборку поля _idrref для записей с соответствующим словом в поле field
		select_word=base.conn.prepare("SELECT _idrref FROM "+field[0]+" WHERE "+field[1]+" LIKE '%$1%'")
		#Для каждой слова в списке слов:
		for word in words:
			#Проверяется:
			try:
				#Возможность выборки данного значения из данного поля данной таблицы
				records=select_word(word)
			#Если невозможно (например не соответствует тип данных)
			except:
				#То ничего
				pass
			#Если возможно
			else:
				#То для каждой найденной записи:
				for record in records:
					#Если данной записи еще нет в результирующем списке:
					if [field[0], field[1], record] not in results_word:
						#К результирующему списку прибавляется список: [таблица, поле, значение]
						results_word+=[[field[0], field[1], record]]
						# Для немедленного ознакомления список выводится на экран
						print([field[0], field[1], record])
	#Создается пустой список результатов:
	result={}
	#Подготвливается запрос на выборку списка полей данной таблицы
	select_table_fields=base.conn.prepare("SELECT column_name FROM information_schema.columns WHERE table_schema='public' AND table_name=$1")
	#Для каждого результат в списке результатов для сумм:
	for result_sum in results_sum:
		#Создается пустой список idreff для данной суммы:
		results_idreffs=[]
		#Выполняется запрос на выборку списка полей таблицы result[0]
		table_fields=select_table_fields(result_sum[0])[0]
		#Для каждого поля в таблице:
		for table_field in table_fields:
			#Для каждого результата в списке полей-таблиц-значений для слов
			for result_word in results_word:
				#Проверяется:
				try:
					#Запрос на выборку записей из таблицы, в которых в данном поле содержится данный _idrref
					idreffs=base.conn.prepare("SELECT "+table_field+" FROM "+result_sum[0]+" WHERE "+table_field+"=$1")(result_word[2][0])[0]
				#Если невозможно (например не соответствует тип данных)
				except:
					#То ничего
					pass
				#Если возможно
				else:
					#Если результат не пустой и данной записи еще нет в результирующем списке:
					if idreffs and [table_field, result_word[0]] not in results_idreffs:
						#К результирующему списку прибавляется список: [справочная таблица, поле в таблице с суммой]
						results_idreffs+=[[table_field, result_word[0]]]
						# Для немедленного ознакомления список выводится на экран
						print([table_field, result_word[0]])
		result[result_sum[0]]

	base.disconnect()
	return
